package netty.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.util.concurrent.TimeUnit;

/**
 * @Description 自定义一个Handler需要继承ChannelInboundHandlerAdapter
 * @Author 李龙平
 * @Date 2020/10/12 10:26
 */

public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    //读取数据（可以读取客服端发送的消息）

    /**
     * @param ctx 上下文对象 可以获取到 管道pipeline 通道 地址
     * @param msg 客服端发送的数据
     * @throws Exception e
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //将msg转ByteBuf
        ByteBuf buf = (ByteBuf)msg;
        System.out.println("客服端发送的数据是" + buf.toString(CharsetUtil.UTF_8));
        /* *
            当业务非常耗时时 》异步执行 》 提交到channel的NioEventLoop的 taskQueue中
         */

        TimeUnit.SECONDS.sleep(2);
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端2", CharsetUtil.UTF_8));


    }

    //数据读取完毕

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端", CharsetUtil.UTF_8));
    }

    //处理异常

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //发生异常时 关闭通道
        ctx.close();
    }
}
